
#include "mechant2.h"
#include <malloc.h>




mechant allouer_mechant(mechant j){
	j.nom = (char *) malloc(100*sizeof(char));
	j.vitesse = (double *) malloc(sizeof(double));
	j.saut = (int *) malloc(sizeof(int));
	j.direction = (int *) malloc(sizeof(int));
	j.pos_x = (double *) malloc(sizeof(double));
	j.pos_y = (double *) malloc(sizeof(double));
	j.ensaut = (int *) malloc(sizeof(int));
	j.pos_y0 = (double *) malloc(sizeof(double));
	j.mort = (int *) malloc(sizeof(int)) ;
	j.images_mechant = (BITMAP**) malloc((NB_IMAGE_MECHANT)*sizeof(BITMAP**)) ;

	return j;
}


void liberer_mechant(mechant j){
	free(j.nom);
	free(j.vitesse);
	free(j.saut);
	free(j.direction);
	free(j.pos_x);
	free(j.pos_y);
	free(j.ensaut);
	free(j.pos_y0);
	free(j.mort) ;
	free(j.images_mechant);

}



mechant init_mechant(int NUMERO_BLOC_LARGEUR, int NUMERO_BLOC_HAUTEUR){
	mechant j;
	j = allouer_mechant(j);
	*j.vitesse = 1;
	*j.saut = 95;
	*j.direction = DROITE;
	*j.pos_x = NUMERO_BLOC_LARGEUR*TAILLE_BLOC;
	*j.pos_y = NUMERO_BLOC_HAUTEUR*TAILLE_BLOC ;
	*j.ensaut = 0;
	*j.mort = 0 ;

	j.images_mechant[0] = load_bitmap("./images/mechant_droite.bmp",NULL);
	j.images_mechant[1] = load_bitmap("./images/mechant_gauche.bmp",NULL);
	j.images_mechant[3] = load_bitmap("./images/explode.bmp",NULL) ;

	return j;
}


void deplacer_gauche_mechant(mechant j){
	*j.pos_x = (*j.pos_x) - (*j.vitesse);
}


void gravite_mechant(mechant j, int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR]){
	if ((*j.pos_y <= (NB_BLOCS_HAUTEUR)*TAILLE_BLOC) && (collision_bas_tous_mechant(j,carte))!=1){
		(*j.pos_y) +=0.5;
	}
}



void afficher_mechant(mechant j, BITMAP* buffer, char carte[LONGEUR_NIVEAU][NB_BLOCS_LARGEUR], int decalage) {

	BITMAP** sprites = j.images_mechant ;
	BITMAP* sprite;
	switch(*j.direction){
	case GAUCHE :
		sprite = sprites[1];
		break;
	case DROITE :
		sprite = sprites[0] ;
		break;
	case NODIR :
		sprite = sprites[0];
		break;
	}

	/*
	if (collision_toute_tous_explosif(j, carte)==1) {
		*j.mort =1 ;
		sprite = sprites[3] ;

	}
	*/
	if (*j.pos_x<0+decalage) {
		*j.mort =1 ;
		sprite = sprites[3] ;
	}


	draw_sprite(buffer,sprite, (int) *j.pos_x, (int) *j.pos_y);
}








int collision_droite_mechant(int posx1, int posy1, int h1, int l1, int posx2, int posy2, int h2, int l2) {
	int res = 0;
	if (posx1 < posx2){
		if(posx1 + (l1) >= posx2 -1){
			if((posy1 + h1 >= posy2) && (posy1 <= posy2 + h2)){
				res = 1;
			}
		}
	}
	return res;
}

int collision_gauche_mechant(int posx1, int posy1, int h1, int l1, int posx2, int posy2, int h2, int l2){
	int res = 0;
	if (posx1 > posx2){
		if(posx1 <= posx2 + (l2) + 1){
			if((posy1 + h1 >= posy2) && (posy1 <= posy2 + h2)){
				res = 1;
			}
		}
	}
	return res;
}

int collision_haut_mechant(int posx1, int posy1, int h1, int l1, int posx2, int posy2, int h2, int l2){
	int res = 0;
	if (posy1 > posy2){
		if(posy1 <= posy2 + (h2) + 1){
			if((posx1 + (l1) >= posx2) && (posx2 + (l2) >= posx1)){
				res = 1;
			}
		}
	}
	return res;
}

int collision_bas_mechant(int posx1, int posy1, int h1, int l1, int posx2, int posy2, int h2, int l2){
	int res = 0;
	if (posy1 < posy2){
		if(posy1 + (h1) >= posy2 - 1){
			if((posx1 + (l1) >= posx2) && (posx2 + (l2) >= posx1)){
				res = 1;
			}
		}
	}
	return res;
}

int collision_droite_tous_mechant(mechant j,char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR]) {

	int res = 0 ;
	int i ;
	int k ;
	for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++) {
		for (k = 0 ; k < LONGEUR_NIVEAU ; k++){
			if (carte[i][k]=='M'){
				if(collision_droite_mechant(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
			}
		}
	}
	return res ;
}









int collision_gauche_tous_mechant(mechant j,char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR]) {

	int res = 0 ;
	int i ;
	int k ;
	for (i = 0 ; i < NB_BLOCS_HAUTEUR; i++) {
		for (k = 0 ; k < LONGEUR_NIVEAU ; k++){
			if (carte[i][k]=='M'){
				if(collision_gauche_mechant(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
			}
		}
	}
	return res ;
}



int collision_haut_tous_mechant(mechant j,char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR]) {

	int res = 0 ;
	int i ;
	int k ;
	for (i = 0 ; i < NB_BLOCS_HAUTEUR; i++) {
		for (k = 0 ; k < LONGEUR_NIVEAU ; k++){
			if (carte[i][k]=='M'){
				if(collision_haut_mechant(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
			}
		}
	}
	return res ;
}


int collision_bas_tous_mechant(mechant j,char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR]) {

	int res = 0 ;
	int i ;
	int k ;
	for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++) {
		for (k = 0 ; k < LONGEUR_NIVEAU ; k++){
			if (carte[i][k]=='M'){
				if(collision_bas_mechant(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
			}
		}
	}
	return res ;
}

/*
int collision_toute_tous_explosif(joueur j, char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR]) {
	int res = 0 ;
	int i ;
	int k ;
	for (i=0; i<NB_BLOCS_HAUTEUR;i++) {
		for (k=0; k<LONGEUR_NIVEAU;k++) {
			if (carte[i][k]=='E') {
				if(collision_bas(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
				if(collision_haut(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
				if(collision_droite(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
				if(collision_gauche(*j.pos_x,*j.pos_y,HAUTEUR_JOUEUR,LARGEUR_JOUEUR,(k)*TAILLE_BLOC,(i)*TAILLE_BLOC,TAILLE_BLOC,TAILLE_BLOC)==1){
					return 1;
				}
			}
		}

	}
	return res ;
}*/
